iT邦幫忙

2

C# 元組與分解 (Tuple And Deconstruct)

c#
  • 分享至 

  • xImage
  •  

分解元組(Deconstructing tuples)的支援必須要至少C# 7.0以上

以前一個funtion如果需要回傳複數個參數你會怎麼做呢?

1.可能會定義一個物件,在回傳的時候宣告並將值塞進去return。(為了一個function而去定義,好醜...)
2.又或者是將回傳參數型別直接改成dynamic,回傳時直接使用匿名物件。(performance炸裂!!!)

如果你使用了上面兩種方式...請一定!一定!!一定!!!要把這篇文章看完。

先來說說在C#7.0以前的處理方法,在呼叫function之前先將欲接收的參數宣告好並傳入。

https://ithelp.ithome.com.tw/upload/images/20220526/20145396G7q6SC4kVv.png

但是這樣做有幾個缺點,

  1. 當傳入的參數與傳出的參數一多起來,function定義時的參數會又臭又長。
  2. 使用這個function前每次都需要宣告變數,不累嗎?
  3. 不管你要不要使用這個參數,你都一定要傳入,因為ref與out不能有預設值。

接下來...讓我與各位介紹 " 元 組 元 素 "!!! (Tuple)

早上好台灣,現在我有Tuple。我很喜歡Tuple,但是速度與激情9比...咳咳...沒事。

先來個簡單的範例
定義一個funciton JohnCena,然後我們就可以很漂亮的一次性取得JohnCena的姓名、出生日期、國籍、年齡等等資料。

https://ithelp.ithome.com.tw/upload/images/20220526/20145396XcGHvPnMKp.png

假如你的參數需要在外面先行宣告也沒問題!

https://ithelp.ithome.com.tw/upload/images/20220526/20145396QOS2ESqW0W.png

而從C#10開始,甚至可以混合使用也沒關係!

https://ithelp.ithome.com.tw/upload/images/20220526/20145396klHbppgtK3.png

這樣我們就輕鬆解決了以前的兩個缺點了,而要解決最後一個缺點更是簡單,
只需要將你想要丟棄(discard)或是用不到的那個參數使用UnderLine( _ )就可以囉!

https://ithelp.ithome.com.tw/upload/images/20220526/20145396tivz0uwvVS.png

元組元素的基礎講完了再來說說解構元素的部分
建構式想必大家都已經很熟悉了

https://ithelp.ithome.com.tw/upload/images/20220526/20145396Id6Ti0tNkF.png

但是'分解式'你有聽過嗎?
顧名思義就是可以定義物件被指派出去的參數!
驚不驚喜! 意不意外?

使用的方法就是在class底下新增一個Deconstruct function

https://ithelp.ithome.com.tw/upload/images/20220526/20145396xncINMRjh1.png

如此一來我們就可以來試試看將John Cena解ㄊ一.... 解構!

https://ithelp.ithome.com.tw/upload/images/20220526/20145396b44WF5TnA9.png

建構式可以多載,分解式當然也可以!

https://ithelp.ithome.com.tw/upload/images/20220526/20145396H6Td4ILrCn.png

以上就是這次的內容,有沒有覺得Coding時的可玩性又更好了呢?
不過要提醒一點,目前分解式並無法使用查看定義來移置相對應的位置,
對於可讀性會有不小的影響,但如果你想要把某個東西藏起來不讓你同事找到... (請不要這樣做!)
這次的範例也歡迎到我的GitHub參考囉!

// 06/09/2022 編輯
https://ithelp.ithome.com.tw/upload/images/20220609/20145396bMVBm5tUUF.png
發現甚至可以將function的回傳參數先行命名!!
直接當成物件使用,對開發效率與可讀性有著明顯的提升,相信會是未來的趨勢。

另外要道歉並修正之前將Deconstruct翻譯成解構式的錯誤
Destruct (解構式)指的是class生命周期結束前執行的function
使用方式是class名稱為dunction名稱並在前面加上波浪符號 '~'
Deconstruct的翻譯應該為分解式


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言